home *** CD-ROM | disk | FTP | other *** search
/ Gold Medal Software 2 / Gold Medal Software Volume 2 (Gold Medal) (1994).iso / prog / asm_n_z.arj / VIDEO.ASM < prev    next >
Assembly Source File  |  1986-04-07  |  20KB  |  448 lines

  1. ;-------------------------------------------------------------------------------
  2. ;
  3. ;    video.asm                                        created 5-11-85
  4. ;
  5. ;    VIDEO ROUTINES
  6. ;    (C) COPYRIGHT 1985 BY THOMAS D. WEBB
  7. ;
  8. ;    MODIFIED FOR MICROSOFT 'C' BY GREGORY ETCHELL            4-1-86
  9. ;
  10. ;    ALL RIGHTS RESERVED.
  11. ;    PERMISSION IS GRANTED FOR UNLIMITED PERSONAL, NON-COMMERCIAL USE ONLY.
  12. ;
  13. ;-------------------------------------------------------------------------------
  14. TITLE              VIDEO
  15.  
  16. _TEXT   SEGMENT  BYTE PUBLIC 'CODE'
  17. _TEXT   ENDS
  18.  
  19. CONST   SEGMENT  WORD PUBLIC 'CONST'
  20. CONST   ENDS
  21.  
  22. _BSS    SEGMENT  WORD PUBLIC 'BSS'
  23. _BSS    ENDS
  24.  
  25. _DATA   SEGMENT  WORD PUBLIC 'DATA'
  26. _DATA   ENDS
  27.  
  28. DGROUP  GROUP    CONST, _BSS, _DATA
  29.         ASSUME    CS: _TEXT, DS: DGROUP, SS: DGROUP, ES:DGROUP
  30.  
  31.  
  32. _BSS               SEGMENT
  33.  
  34. BUFFER_SIZE        EQU       2000D    ;THE VIDEO BUFFER SIZE IN WORDS
  35. NUM_BYTES_IN_ROW   EQU       80       ;NUMBER OF BYTES IN A ROW
  36. MONOCHROME_SEGADR  EQU       0B000H   ;ADDRESS OF MONOCHROME BUFFER
  37. GRAPHICS_SEGADR    EQU       0B800H   ;ADDRESS OF GRAPHICS BUFFER
  38.                    EVEN
  39. _BSS               ENDS
  40.  
  41. _TEXT              SEGMENT
  42.  
  43. ;-------------------------------------------------------------------------------
  44. ; CLEAR            (ROUTINE 1)
  45. ;      THIS ROUTINE CLEARS THE SCREEN
  46. ; THE C LANGUAGE CALL IS:
  47. ;      CLEAR();
  48. ; THE ASSEMBLY CALL IS:
  49. ;      CALL CLEAR
  50. ;-------------------------------------------------------------------------------
  51.                    PUBLIC    _clear
  52. _clear             PROC      NEAR
  53.                    PUSH      BP          ;THE FRAME POINTER
  54.                    MOV       AH,6        ;SCROLL ACTIVE PAGE UP
  55.                    MOV       AL,019H     ;CLEAR 25 LINES
  56.                    MOV       CX,0H       ;UPPER LEFT OF SCROLL
  57.                    MOV       DX,2479H    ;LOWER RIGHT OF SCROLL
  58.                    MOV       BH,7H       ;USE NORMAL ATTRIBUTE ON BLANKED LINE
  59.                    INT       10H         ;VIDEO-IO
  60.                    POP       BP          ;THE FRAME POINTER
  61.                    RET
  62. _clear             ENDP
  63.  
  64. ;-------------------------------------------------------------------------------
  65. ; LOCATE           (ROUTINE 2)
  66. ;        THIS ROUTINE WILL LOCATE THE CURSOR AT A ROW AND COLUMN ON THE SCREEN
  67. ; THE C LANGUAGE CALL IS:
  68. ;        LOCATE(ROW,COLUMN);è; THE ASSEMBLY CALL IS:
  69. ;        MOV    DX,COL     ;RANGE IS 0 - 79
  70. ;        PUSH   DX
  71. ;        MOV    DX,ROW     ;RANGE IS 0 - 24
  72. ;        PUSH   DX
  73. ;        CALL   LOCATE
  74. ;-------------------------------------------------------------------------------
  75.                    PUBLIC    _locate
  76. _locate            PROC      NEAR                ;PROC TO LOCATE THE CURSOR
  77.                    PUSH      BP                  ;THE FRAME POINTER
  78.                    MOV       BP,SP               ;POINT TO MOST RECENT STACK ELE
  79.                    MOV       DH,[BP+4]           ;GET THE ROW..
  80.                    MOV       DL,[BP+6]           ;..AND THE COL
  81.                    MOV       BH,0H               ;GRAPHICS PAGE NO.
  82.                    MOV       AH,2H               ;SET_CURSOR_POSITION
  83.                    INT       10H                 ;VIDEO-IO
  84.                    POP       BP                  ;THE FRAME POINTER
  85.                    RET
  86. _locate            ENDP
  87.  
  88. ;-------------------------------------------------------------------------------
  89. ; CURSIZE          (ROUTINE 3)
  90. ;        THIS ROUTINE SETS THE SIZE OF THE CURSOR
  91. ; THE C LANGUAGE CALL IS:
  92. ;        CURSIZE(START_LINE,STOP_LINE);
  93. ; THE ASSEMBLY CALL IS:
  94. ;        MOV    DX,STOP_LINE   ;13 IS NORMAL STOP_LINE FOR MONOCHROME ADAPTOR
  95. ;        PUSH   DX
  96. ;        MOV    DX,START_LINE  ;12 IS NORMAL START_LINE FOR MONOCHROME ADAPTOR
  97. ;        PUSH   DX
  98. ;        CALL   CURSIZE
  99. ;-------------------------------------------------------------------------------
  100.                    PUBLIC    _cursize
  101. _cursize           PROC      NEAR
  102.                    PUSH      BP                  ;THE FRAME POINTER
  103.                    MOV       BP,SP               ;POINT TO MOST RECENT STACK ELE
  104.                    MOV       CH,[BP+4]           ;CURSOR START LINE
  105.                    MOV       CL,[BP+6]           ;CURSOR STOP LINE
  106.                    MOV       AH,1H               ;SET CURSOR TYPE
  107.                    INT       10H                 ;VIDEO-IO
  108.                    POP       BP                  ;THE FRAME POINTER
  109.                    RET
  110. _cursize           ENDP
  111.  
  112. ;-------------------------------------------------------------------------------
  113. ; GET_MODE         (ROUTINE 4)
  114. ;     THIS ROUTINE RETURNS THE CRT MODE IN AL, AND THE NUMBER OF CHARACTER
  115. ;     COLUMNS ON THE SCREEN IN AH
  116. ; THE C LANGUAGE CALL IS: mode_area.value = get_mode();
  117. ;     WHERE mode_area is defined as:
  118. ; union
  119. ;   {
  120. ;    int value;
  121. ;    struct
  122. ;       {è;         char al;           /*al EQ 7 is monochrome*/
  123. ;         char ah;           /*number of character columns on the screen*/
  124. ;       } al_ah;
  125. ;   } mode_area;
  126. ;
  127. ; THE ASSEMBLY CALL IS:
  128. ;      CALL GET_MODE
  129. ;-------------------------------------------------------------------------------
  130.                    PUBLIC      _get_mode
  131. _get_mode          PROC        NEAR
  132.                    PUSH        BP           ;THE FRAME POINTER
  133.                    MOV         AX,0         ;CLEAR THE REG
  134.                    MOV         AH,15        ;GET CURRENT VIDEO MODE
  135.                    INT         10H          ;VIDEO-IO
  136.                    POP         BP           ;THE FRAME POINTER
  137.                    RET
  138. _get_mode          ENDP
  139.  
  140. ;-------------------------------------------------------------------------------
  141. ; SET_VIDEO_ADDRESS (ROUTINE 5)
  142. ;     THIS ROUTINE IS USED IN SEVERAL OF THE OTHER ROUTINES TO TEST THE VIDEO
  143. ;     MODE AND TO SET THE CORRECT VIDEO BUFFER ADDRESS (MONOCHROME OR GRAPHICS).
  144. ;     THE VIDEO BUFFER ADDRESS IS RETURNED IN AX.
  145. ;     THIS IS AN INTERNAL ROUTINE SO THE C LANGUAGE AND ASSEMBLY LANGUAGE
  146. ;     CALLS ARE NOT SHOWN IN THIS PROLOGUE.
  147. ;-------------------------------------------------------------------------------
  148. SET_VIDEO_ADDRESS  PROC      NEAR
  149.                    CALL      _get_mode           ;GET CRT MODE
  150.                    CMP       AL,7H               ;IS IT A MONOCHROME CARD?
  151.                    JNE       ITS_GRAPHICS
  152.                    MOV       AX,MONOCHROME_SEGADR ;MONOCHROME BUFFER SEG ADDR
  153.                    JMP       RETURN
  154. ITS_GRAPHICS:      MOV       AX,GRAPHICS_SEGADR  ;GRAPHICS BUFFER SEG ADR
  155. RETURN:            RET
  156. SET_VIDEO_ADDRESS  ENDP
  157.  
  158. ;-------------------------------------------------------------------------------
  159. ; CALC_VIDEO_OFFSET   (ROUTINE 6)
  160. ;     THIS ROUTINE IS USED BY SEVERAL OF THE ROUTINES TO CALCULATE THE OFFSET
  161. ;     INTO THE VIDEO BUFFER FOR MOVING CHARACTERS INTO OR FROM THE VIDEO BUFFER.
  162. ;     DX MUST BE SET TO THE ROW, AND CX MUST BE SET TO THE COLUMN BEFORE THIS
  163. ;     ROUTINE IS EXECUTED. THE OFFSET IS RETURNED IN AX.
  164. ;     THIS IS AN INTERNAL ROUTINE SO THE C LANGUAGE AND ASSEMBLY LANGUAGE
  165. ;     CALLS ARE NOT SHOWN IN THIS PROLOGUE.
  166. ;-------------------------------------------------------------------------------
  167. CALC_VIDEO_OFFSET PROC      NEAR
  168.                   MOV       AX,NUM_BYTES_IN_ROW ;NUMBER OF BYTES IN ROW
  169.                   MUL       DX                  ;RESULT IS IN AX
  170.                   ADD       AX,CX               ;THE COL
  171.                   SHL       AX,1                ;MULTIPLY BY 2 FOR CHAR/ATTR
  172.                   RET
  173. CALC_VIDEO_OFFSET ENDP
  174.  
  175. ;-------------------------------------------------------------------------------
  176. ; ISRTSTR         (ROUTINE 7)
  177. ;       THIS ROUTINE POSITIONS ITSELF IN THE VIDEO BUFFER, THEN INSERTS A
  178. ;       NULL-TERMINATED STRING, ALONG WITH AN ATTRIBUTE, DIRECTLY INTO THE VIDEO
  179. ;       BUFFER
  180. ; THE C LANGUAGE CALL IS:  ISRTSTR(ROW,COL,STRING,ATTR);
  181. ; THE ASSEMBLY CALL IS:
  182. ;        MOV    DX,ATTRIBUTE   ;THE ATTRIBUTE BYTE (VALUE OF NORMAL IS 7)
  183. ;        PUSH   DX
  184. ;        LEA    DX,STRING      ;GET ADDRESS OF THE STRING
  185. ;        PUSH   DX
  186. ;        MOV    DX,COL         ;RANGE IS 0 - 79
  187. ;        PUSH   DX
  188. ;        MOV    DX,ROW         ;RANGE IS 0 - 24
  189. ;        PUSH   DX
  190. ;        CALL   ISRTSTR
  191. ;-------------------------------------------------------------------------------
  192.                    PUBLIC    _isrtstr
  193. _isrtstr           PROC      NEAR
  194.  
  195.                    PUSH      ES
  196.  
  197.                    PUSH      BP                  ;THE FRAME POINTER
  198.                    MOV       BP,SP               ;POINT TO STACK
  199.  
  200.                    MOV       DX,[BP+6]           ;GET THE ROW
  201.                    MOV       CX,[BP+8]           ;GET THE COLUMN
  202.                    CALL      CALC_VIDEO_OFFSET   ;CALC OFFSET INTO VIDEO BUFFER
  203.                    MOV       DI,AX               ;OFFSET WAS RETURNED IN AX
  204.  
  205.                    MOV       SI,[BP+10]          ;GET THE SOURCE STRING OFFSET
  206.                    MOV       DH,[BP+12]          ;GET THE ATTRIBUTE BYTE
  207.  
  208.                    CALL      SET_VIDEO_ADDRESS   ;SET THE MONOCHROME OR GRAPHICS
  209.                    MOV       ES,AX               ;..VIDEO BUFFER ADDRESS INTO ES
  210.  
  211. ISRT_LOOP:         MOV       DL,BYTE PTR [SI]    ;THE CHARACTER TO INSERT
  212.                    CMP       DL,0                ;IS IT END OF STRING?
  213.                    JE        ISRTSTR_EXIT        ;EXIT IF END OF STRING
  214.                    MOV       ES:WORD PTR [DI],DX ;MOVE CHAR AND ATTR TO CRT BUF
  215.                    ADD       DI,2H               ;POINT TO NEXT CRT BUF LOC
  216.                    ADD       SI,1H               ;POINT TO NEXT SORC STRING BYTE
  217.                    JMP       ISRT_LOOP           ;GO MOVE ANOTHER WORD
  218.  
  219. ISRTSTR_EXIT:      POP       BP                  ;THE FRAME POINTER
  220.                    POP       ES
  221.  
  222.                    RET
  223. _isrtstr           ENDP
  224.  
  225. ;-------------------------------------------------------------------------------
  226. ; ISRTCNT          (ROUTINE 8)
  227. ;        THIS ROUTINE POSITIONS ITSELF IN THE VIDEO BUFFER, THEN INSERTS
  228. ;        N BYTES FROM AN ARRAY DIRECTLY INTO THE VIDEO BUFFER, ALONG WITH AN
  229. ;        ATTRIBUTE BYTE
  230. ; THE C LANGUAGE CALL IS:
  231. ;        ISRTCNT(ROW,COL,STRING,ATTR,NUM_BYTES);è; THE ASSEMBLY CALL IS:
  232. ;        MOV    DX,NUM_BYTES      ;THE NUMBER OF BYTES TO BE DISPLAYED
  233. ;        PUSH   DX
  234. ;        MOV    DX,ATTRIBUTE      ;THE ATTRIBUTE BYTE (NORMAL VALUE IS 7)
  235. ;        PUSH   DX
  236. ;        LEA    DX,ARRAY          ;GET THE CHARACTER ARRAY ADDRESS
  237. ;        PUSH   DX
  238. ;        MOV    DL,COL            ;RANGE IS 0 - 79
  239. ;        PUSH   DX
  240. ;        MOV    DL,ROW            ;RANGE IS 0 - 24
  241. ;        PUSH   DX
  242. ;        CALL   ISRTCNT
  243. ;-------------------------------------------------------------------------------
  244.                    PUBLIC    _isrtcnt
  245. _isrtcnt           PROC      NEAR
  246.  
  247.                    PUSH      ES
  248.  
  249.                    PUSH      BP                  ;THE FRAME POINTER
  250.                    MOV       BP,SP               ;POINT TO STACK
  251.  
  252.                    MOV       DX,[BP+6]           ;GET THE ROW
  253.                    MOV       CX,[BP+8]           ;GET THE COLUMN
  254.                    CALL      CALC_VIDEO_OFFSET   ;CALC OFFSET INTO VIDEO BUFFER
  255.                    MOV       DI,AX               ;OFFSET WAS RETURNED IN AX
  256.  
  257.                    MOV       SI,[BP+10]          ;GET THE SOURCE STRING OFFSET
  258.                    MOV       DH,[BP+12]          ;GET THE ATTRIBUTE BYTE
  259.                    MOV       CX,[BP+14]          ;GET NUMBER OF BYTES TO INSERT
  260.  
  261.                    CALL      SET_VIDEO_ADDRESS   ;SET THE MONOCHROME OR GRAPHICS
  262.                    MOV       ES,AX               ;..VIDEO BUFFER ADDRESS INTO ES
  263.  
  264. ISRTCNT_LOOP:      MOV       DL,BYTE PTR [SI]    ;THE CHARACTER TO INSERT
  265.                    MOV       ES:WORD PTR [DI],DX ;MOVE CHAR AND ATTR TO CRT BUF
  266.                    ADD       DI,2H               ;POINT TO NEXT CRT BUF LOC
  267.                    ADD       SI,1H               ;POINT TO NEXT SORC STRING BYTE
  268.                    LOOP      ISRTCNT_LOOP        ;GO MOVE ANOTHER WORD
  269.  
  270. ISRTCNT_EXIT:      POP       BP                  ;THE FRAME POINTER
  271.                    POP       ES
  272.  
  273.                    RET
  274. _isrtcnt           ENDP
  275.  
  276. ;-------------------------------------------------------------------------------
  277. ; PUTCHAT          (ROUTINE 9)
  278. ;     WRITES A CHARACTER AND ATTRIBUTE TO THE SCREEN. THE CURSOR DOES NOT MOVE.
  279. ; THE C LANGUAGE CALL IS:  PUTCHAT(CHARACTER,ATTR);
  280. ; THE ASSEMBLY LANGUAGE CALL IS:
  281. ;         MOV    DX,0
  282. ;         MOV    DL,CHARACTER      ;THE CHARACTER TO BE DISPLAYED
  283. ;         PUSH   DX
  284. ;         MOV    DL,ATTRIBUTE      ;THE ATTRIBUTE TO BE DISPLAYED
  285. ;         PUSH   DXè;         CALL   PUTCHAT
  286. ;-------------------------------------------------------------------------------
  287.                    PUBLIC    _putchat
  288. _putchat           PROC      NEAR
  289.                    PUSH      BP                  ;THE FRAME POINTER
  290.                    MOV       BP,SP               ;POINT TO STACK
  291.                    MOV       AL,[BP+4]           ;THE CHARACTER
  292.                    MOV       BL,[BP+6]           ;THE ATTRIBUTE
  293.                    MOV       BH,0H               ;DISPLAY PAGE #
  294.                    MOV       CX,1H               ;NUMBER OF CHARACTERS TO WRITE
  295.                    MOV       AH,9H               ;WRITE CHAR/ATTR AT CURPOS
  296.                    INT       10H                 ;VIDEO_IO
  297.                    POP       BP                  ;THE FRAME POINTER
  298.                    RET
  299. _putchat           ENDP
  300.  
  301. ;-------------------------------------------------------------------------------
  302. ; CRTBUF           (ROUTINE 10)
  303. ;       ACCEPTS TWO PARAMETERS:
  304. ;          1.   SAVE = 0 AND REPLACE = 1.
  305. ;          2.   THE ADDRESS TO SAVE THE VIDEO BUFFER INTO OR REPLACE THE VIDEO
  306. ;               BUFFER FROM
  307. ;       CALLS CRTSAVE TO SAVE THE CRT BUFFER,
  308. ;       CALLS CRTREPL TO REPLACE THE CRT BUFFER.
  309. ; THE C LANGUAGE CALL IS: CRTBUF(SAVE,SAVE_AREA); OR CRTBUF(REPLACE,SAVE_AREA);
  310. ; THE ASSEMBLY CALL IS:
  311. ;            LEA  DX,SAVE_AREA ;GET ADDRESS OF SAVE_AREA
  312. ;            PUSH DX
  313. ;            MOV  DX,0         ;SAVE (MOV DX,1 TO REPLACE)
  314. ;            PUSH DX
  315. ;            CALL CRTBUF
  316. ;-------------------------------------------------------------------------------
  317.                    PUBLIC    _crtbuf
  318. _crtbuf            PROC      NEAR
  319.                    PUSH      BP                  ;THE FRAME POINTER
  320.                    MOV       BP,SP               ;POINT TO STACK
  321.  
  322.                    MOV       DX,[BP+4]           ;SAVE/RESTORE INDICATOR
  323.                    CMP       DX,0                ;SAVE THE CRT BUFFER?
  324.                    JNE       RESTORE_IT
  325. SAVE_IT:           CALL      CRTSAVE
  326.                    JMP       CRTBUF_EXIT
  327. RESTORE_IT:        CALL      CRTREPL
  328.  
  329. CRTBUF_EXIT:       POP       BP                  ;THE FRAME POINTER
  330.  
  331.                    RET
  332. _crtbuf            ENDP
  333.  
  334. ;-------------------------------------------------------------------------------
  335. ; CRTSAVE          (ROUTINE 11)
  336. ;      THIS ROUTINE IS CALLED BY CRTBUF TO SAVE THE CRT BUFFER INTO A SAVE AREA.
  337. ;
  338. ;-------------------------------------------------------------------------------
  339. CRTSAVE            PROC      NEAR
  340.  
  341.                    PUSH      ES                  ;ES AND DS ARE MODIFIED..
  342.                    PUSH      DS                  ;..SO SAVE THEM
  343.  
  344.                    PUSH      BP                  ;SAVE THE FRAME POINTER
  345.                    MOV       BP,SP               ;ADDRESS THE STACK
  346.  
  347.                    MOV       CX,DS               ;DATA SEG IS THE DESTINATION
  348.                    MOV       ES,CX               ;ES HAS DESTINATION SEG ADDR
  349.                    MOV       DI,[BP+14]          ;DESTINATION OFFSET
  350.  
  351.                    MOV       CX,BUFFER_SIZE      ;THE BUFFER SIZE IN WORDS
  352.  
  353.                    CALL      SET_VIDEO_ADDRESS   ;SET THE MONOCHROME OR GRAPHICS
  354.                    MOV       DS,AX               ;..VIDEO BUFFER ADDRESS INTO DS
  355.  
  356.                    MOV       SI,0                ;SOURCE OFFSET
  357.  
  358.                    CLD                           ;SET DF=0 TO MOVE FORWARD
  359. REP                MOVSW                         ;MOVE 2000 WORDS
  360.                                                  ;THE FRAME POINTER
  361.                    POP       BP                  ;MUST RESTORE DS..
  362.                    POP       DS                  ;..AND ES
  363.                    POP       ES
  364.                    RET
  365. CRTSAVE            ENDP
  366.  
  367. ;-------------------------------------------------------------------------------
  368. ; CRTREPL          (ROUTINE 12)
  369. ;   THIS ROUTINE IS CALLED BY CRTBUF TO REPLACE THE CRT BUFFER FROM A SAVE AREA.
  370. ;
  371. ;-------------------------------------------------------------------------------
  372. CRTREPL            PROC      NEAR
  373.  
  374.                    PUSH      ES                  ;ES IS MODIFIED, SO SAVE IT
  375.  
  376.                    PUSH      BP                  ;SAVE THE FRAME POINTER
  377.                    MOV       BP,SP               ;ADDRESS THE STACK
  378.  
  379.                    MOV       SI,[BP+12]          ;SOURCE OFFSET
  380.  
  381.                    CALL      SET_VIDEO_ADDRESS   ;SET THE MONOCHROME OR GRAPHICS
  382.                    MOV       ES,AX               ;..VIDEO BUFFER ADDRESS INTO ES
  383.  
  384.                    MOV       DI,0                ;DESTINATION OFFSET
  385.  
  386.                                                  ;DS HAS SOURCE SEG ADDR
  387.                    MOV       CX,BUFFER_SIZE      ;THE BUFFER SIZE IN WORDS
  388.  
  389.                    CLD                           ;SET DF=0 TO MOVE FORWARD
  390. REP                MOVSW                         ;MOVE 2000 WORDS
  391.  
  392.                    POP       BP                  ;THE FRAME POINTER
  393.                    POP       ES                  ;MUST RESTORE ES
  394.                    RET
  395. CRTREPL            ENDP
  396.  
  397. ;-------------------------------------------------------------------------------
  398. ; SCANCRT          (ROUTINE 13)
  399. ;   POSITIONS ITSELF IN THE CRT BUFFER, THEN MOVES N BYTES, NOT NULL-TERMINATED,
  400. ;   TO THE ADDRESS OF AN ARRAY PROVIDED BY THE CALLER.
  401. ;
  402. ; THE C LANGUAGE CALL IS:  SCANCRT(ROW,COL,STRING,NUM_BYTES);
  403. ; THE ASSEMBLY CALL IS:
  404. ;        MOV    DX,NUM_BYTES        ;THE NUMBER OF BYTES TO MOVE
  405. ;        PUSH   DX
  406. ;        LEA    DX,ARRAY            ;GET CHARACTER ARRAY ADDRESS
  407. ;        PUSH   DX
  408. ;        MOV    DX,COL              ;RANGE IS 0 - 79
  409. ;        PUSH   DX
  410. ;        MOV    DX,ROW              ;RANGE IS 0 - 24
  411. ;        PUSH   DX
  412. ;        CALL   SCANCRT
  413. ;-------------------------------------------------------------------------------
  414.                    PUBLIC    _scancrt
  415. _scancrt           PROC      NEAR
  416.  
  417.                    PUSH      ES                  ;ES IS MODIFIED, SO SAVE IT
  418.  
  419.                    PUSH      BP                  ;THE FRAME POINTER
  420.                    MOV       BP,SP               ;POINT TO STACK
  421.  
  422.                    MOV       DX,[BP+6]           ;GET THE ROW
  423.                    MOV       CX,[BP+8]           ;GET THE COLUMN
  424.                    CALL      CALC_VIDEO_OFFSET   ;CALC OFFSET INTO VIDEO BUFFER
  425.                    MOV       DI,AX               ;OFFSET WAS RETURNED IN AX
  426.  
  427.                    MOV       SI,[BP+10]          ;GET THE SOURCE STRING OFFSET
  428.                    MOV       CX,[BP+12]          ;NUMBER OF BYTES TO MOVE
  429.  
  430.                    CALL      SET_VIDEO_ADDRESS   ;SET THE MONOCHROME OR GRAPHICS
  431.                    MOV       ES,AX               ;..VIDEO BUFFER ADDRESS INTO ES
  432.  
  433. SCAN_LOOP:         MOV       DL,ES:BYTE PTR [DI] ;GET CHAR FROM CRT BUFFER
  434.                    MOV       BYTE PTR[SI],DL     ;MOVE CHAR TO STRING IN CALLER
  435.                    ADD       DI,2H               ;POINT TO NEXT CRT_BUF LOC
  436.                    ADD       SI,1H               ;POINT TO NEXT DEST STRING BYTE
  437.                    LOOP      SCAN_LOOP
  438.  
  439. SCANCRT_EXIT:      POP       BP                  ;THE FRAME POINTER
  440.                    POP       ES                  ;MUST RESTORE ES
  441.  
  442.                    RET
  443. _scancrt           ENDP
  444.  
  445.  
  446. _TEXT              ENDS
  447.                    END
  448.